// 2. 基于以下代码完成下面的四个练习
const fp = require('lodash/fp');
const _ = require('lodash');

//数据
// horsepower 马力，dollar_value 价格，in_stock 库存
const cars = [{
  name: 'Ferrari FF',
  horsepower: 660,
  dollar_value: 700000,
  in_stock: true
},{
  name: 'SpyKer C12 Zagato',
  horsepower: 650,
  dollar_value: 648000,
  in_stock: false
},{
  name: 'Jaguar XKR-S',
  horsepower: 550,
  dollar_value: 132000,
  in_stock: false
},{
  name: 'Audi R8',
  horsepower: 525,
  dollar_value: 114200,
  in_stock: false
},{
  name: 'Aston Martin One-77',
  horsepower: 750,
  dollar_value: 1850000,
  in_stock: true
},{
  name: 'Pagani Huayra',
  horsepower: 700,
  dollar_value: 1300000,
  in_stock: false
}];

// 练习1：使用函数组合fp.flowRight()重新实现下面这个函数
let isLastInStock = function (cars) {
  // 获取最后一条数据
  let last_car = fp.last(cars);
  console.log(last_car, 'last_car')
  return fp.prop('in_stock', last_car);
}

// 我的答案：
const reverse = function(arr) {
  return arr.reverse();
}
const first = function (arr) {
  return arr[0];
}
const isInStock = function(obj) {
  return obj.in_stock;
}
const isLastInStock = fp.flowRight(isInStock, first, reverse);
console.log(isLastInStock(cars));

// ----------------------------------------------

// 练习2：使用fp.flowRight(), fp.prop()和fp.first()获取第一个car的name
const getFirstName = fp.flowRight(fp.prop('name'), fp.first);
console.log(getFirstName(cars));

// ----------------------------------------------

// 练习3：使用帮助函数_average重构averageDollarValue, 使用函数组合的方式实现
let _average = function(xs) {
  return fp.reduce(fp.add, 0, xs) / xs.length;
}; // 无需改动
let averageDollarValue = function (cars) {
  let dollar_values = fp.map(function(car) {
    return car.dollar_value;
  }, cars);
  console.log(dollar_values, 'eee');
  return _average(dollar_values)
};
console.log(averageDollarValue(cars));

// 我改造之后的函数
const getDollor = function(cars) {
  let dollar = fp.map(function (car) {
    return car.dollar_value
  }, cars);
  return dollar;
}
const f = fp.flowRight(_average, getDollor);
console.log(f(cars));

// ----------------------------------------------

// 练习4：使用flowRight写一个sanitizeNames函数，返回一个下划线连接的小写字符串，把数组中的name转换为这种形式，例如：sanitizeNames(['Hello World']) => ['hello_wrold']
let _underscore = fp.replace(/\W+/g, '_');
function sanitizeNames (str) {
  const f = fp.flowRight(_underscore, fp.join('_'), fp.map(fp.toLower), fp.split(' '));
  return f(str);
}
console.log(sanitizeNames('Hello World Name')); // 结果：hello_world_name